package 二分;

import org.junit.Test;

/**
 * 局部最小值，和局部最大值问题
 * 注意是 **局部**  （不是 整体）
 * 
 * 还是 while 的 判断条件
 * l < r
 * 还是 l <= r
 * 都是可以的但是就是最后退出循环的时候
 * 两种的 condition 会有一点点代码逻辑上的不同
 */
public class lc162 {

	public static void main(String []args) {
		int nums[] = {1,2,3,1};
		System.out.println(solutionOne(nums));
	}
	
	public static int solution(int nums[]) {
		int len = nums.length;
		if(len == 1)
			return 0;
//		if(nums[0] > nums[1])
//			return 0;
//		if(nums[len - 1] > nums[len - 2])
//			return len -1 ;
		int l = 0;
		int r = len - 1;
		int index = -1;
		while(l <= r) {
			int mid = l + r >> 1;
			int leftValue = mid == 0 ? Integer.MIN_VALUE : nums[mid - 1];
			int rightValue = mid == len - 1 ?Integer.MIN_VALUE : nums[mid + 1];
//			System.out.println(mid + " " + leftValue + " " + rightValue);
			if(nums[mid] > leftValue && nums[mid] > rightValue) 
				return mid;
			else if(nums[mid] < leftValue)
				r = mid - 1;
			else
				l = mid + 1;
		}
		return  -1;
	}
	 
	// 我个人还是更倾向于 下面这种 代码的实现方式
	public static int solutionOne(int nums[]) {
		int len = nums.length;
		if(len == 1)
			return 0;
		if(nums[0] > nums[1])
			return 0;
		if(nums[len - 1] > nums[len - 2])
			return len -1 ;
		int l = 1;
		int r = len - 2;
		while(l <= r) {
			int mid = l + r >> 1;
			if(nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) 
				return mid;
			else if(nums[mid] < nums[mid - 1])
				r = mid - 1;
			else
				l = mid + 1;
		}
		return  -1;
	}









	// 2023/8/12  寻找峰值


	public int solve(int nums[]){
		int l = 0, r = nums.length - 1;
		if(r == 0){
			return 0;
		}
		while(l < r){
			int mid = l + r >> 1;

			if(nums[mid] > nums[mid - 1]){
				l = mid;
			}else{
				r = mid - 1;
			}
		}
		return l;
	}


	@Test
	public void test(){
		System.out.println("hje");
		F f = new s();
		System.out.println("end");

		synchronized (in.class){
			System.out.println("hello");
		}


	}

}

class F{
	private Integer x;

	String s = " hell world!";


}


class s extends  F{


}

interface in{
	int a = 10;

}